#include "VScintilla.h"
#include <QVariant>

VScintilla::VScintilla(QWidget * parent):
    QsciScintilla(parent)
{
//    init_setting();
//    init_connect();
}

VScintilla::~VScintilla()
{
}

//void VScintilla::init_setting()
//{
//    _lexer = new VQscilexerCppAttach();
//    _lexer->setFont(QFont("YaHei Consolas Hybrid", 10));
//    _lexer->setColor(QColor(Qt::yellow), QsciLexerCPP::CommentLine);
//    _lexer->setColor(QColor(62, 156, 216), QsciLexerCPP::Keyword);
//    _lexer->setColor(QColor(62, 156, 216), QsciLexerCPP::KeywordSet2);
//    _lexer->setColor(QColor(214, 157, 133), QsciLexerCPP::DoubleQuotedString);
//    _lexer->setFoldCompact(false);

//    _lexer->setPaper(QColor(30, 30, 30), -1);
//    _lexer->setColor(QColor(67, 166, 74), QsciLexerCPP::CommentLine);
//    _lexer->setColor(QColor(212, 212, 212), QsciLexerCPP::Identifier);
//    _lexer->setColor(QColor(212, 212, 212), QsciLexerCPP::Operator);
//    this->setLexer(_lexer);

//    this->setMarginType(QsciScintilla::SC_MARGIN_NUMBER, QsciScintilla::NumberMargin);
//    this->setMarginLineNumbers(QsciScintilla::SC_MARGIN_NUMBER, true);
//    this->setMarginWidth(QsciScintilla::SC_MARGIN_NUMBER, 30);
//    this->setMarginsFont(QFont("YaHei Consolas Hybrid", 10));
//    this->setMarginBackgroundColor(QsciScintilla::SC_MARKNUM_FOLDER, QColor(255, 0, 255));
//    this->SendScintilla(QsciScintilla::SCI_STYLESETBACK, QsciScintilla::STYLE_LINENUMBER, QColor(30, 30, 30));
//    this->SendScintilla(QsciScintilla::SCI_STYLESETFORE, QsciScintilla::STYLE_LINENUMBER, QColor(38, 145, 175));
//    this->setUtf8(true);

//    // fold
//    this->setProperty("fold", QVariant(true));
//    this->setMarginWidth(QsciScintilla::SC_MARGIN_BACK, 13);
//    this->setMarginWidth(QsciScintilla::SC_MARGIN_FORE, 13);
//    this->setMarginMarkerMask(QsciScintilla::SC_MARGIN_FORE, QsciScintilla::SC_MASK_FOLDERS);
//    this->setMarginSensitivity(QsciScintilla::SC_MARGIN_FORE, true);
//    this->setFoldMarginColors(QColor(30, 30, 30), QColor(30, 30, 30));

//    this->markerDefine(QsciScintilla::MarkerSymbol::BoxedMinus, QsciScintilla::SC_MARKNUM_FOLDEROPEN);
//    this->setMarkerForegroundColor(QColor(152, 152, 152), QsciScintilla::SC_MARKNUM_FOLDEROPEN);
//    this->setMarkerBackgroundColor(QColor(0, 0, 0), QsciScintilla::SC_MARKNUM_FOLDEROPEN);

//    this->markerDefine(QsciScintilla::MarkerSymbol::BoxedPlus, QsciScintilla::SC_MARKNUM_FOLDER);
//    this->setMarkerForegroundColor(QColor(152, 152, 152), QsciScintilla::SC_MARKNUM_FOLDER);
//    this->setMarkerBackgroundColor(QColor(0, 0, 0), QsciScintilla::SC_MARKNUM_FOLDER);

//    this->markerDefine(QsciScintilla::MarkerSymbol::VerticalLine, QsciScintilla::SC_MARKNUM_FOLDERSUB);
//    this->setMarkerForegroundColor(QColor(0, 0, 0), QsciScintilla::SC_MARKNUM_FOLDERSUB);
//    this->setMarkerBackgroundColor(QColor(152, 152, 152), QsciScintilla::SC_MARKNUM_FOLDERSUB);

//    this->markerDefine(QsciScintilla::MarkerSymbol::BottomLeftCorner, QsciScintilla::SC_MARKNUM_FOLDERTAIL);
//    this->setMarkerForegroundColor(QColor(0, 0, 0), QsciScintilla::SC_MARKNUM_FOLDERTAIL);
//    this->setMarkerBackgroundColor(QColor(152, 152, 152), QsciScintilla::SC_MARKNUM_FOLDERTAIL);

//    this->markerDefine(QsciScintilla::MarkerSymbol::BoxedPlusConnected, QsciScintilla::SC_MARKNUM_FOLDEREND);
//    this->setMarkerForegroundColor(QColor(0, 0, 0), QsciScintilla::SC_MARKNUM_FOLDEREND);
//    this->setMarkerBackgroundColor(QColor(152, 152, 152), QsciScintilla::SC_MARKNUM_FOLDEREND);

//    this->markerDefine(
//        QsciScintilla::MarkerSymbol::BoxedMinusConnected, QsciScintilla::SC_MARKNUM_FOLDEROPENMID);
//    this->setMarkerForegroundColor(QColor(0, 0, 0), QsciScintilla::SC_MARKNUM_FOLDEROPENMID);
//    this->setMarkerBackgroundColor(QColor(152, 152, 152), QsciScintilla::SC_MARKNUM_FOLDEROPENMID);

//    this->markerDefine(QsciScintilla::MarkerSymbol::VerticalLine, QsciScintilla::SC_MARKNUM_FOLDERMIDTAIL);
//    this->setMarkerForegroundColor(QColor(0, 0, 0), QsciScintilla::SC_MARKNUM_FOLDERMIDTAIL);
//    this->setMarkerBackgroundColor(QColor(152, 152, 152), QsciScintilla::SC_MARKNUM_FOLDERMIDTAIL);

//    // this->markerDefine(QsciScintilla::SC_MARKNUM_FOLDER, QsciScintilla::SC_MARK_BOXPLUS);
//    this->markerDefine(QsciScintilla::MarkerSymbol::BoxedMinus, QsciScintilla::SC_MARKNUM_FOLDEROPEN);
//    this->setMarkerForegroundColor(QColor(0, 0, 0), QsciScintilla::SC_MARKNUM_FOLDEROPEN);
//    this->setMarkerBackgroundColor(QColor(152, 152, 152), QsciScintilla::SC_MARKNUM_FOLDEROPEN);

//    // this->setmar
//    this->setTabWidth(4);
//    this->setIndentationGuides(true);
//    this->setIndentationGuidesForegroundColor(QColor(30, 30, 30));
//    this->setIndentationGuidesBackgroundColor(QColor(152, 152, 152));

//    this->SendScintilla(QsciScintilla::SCI_MARKERENABLEHIGHLIGHT, true);
//    this->SendScintilla(QsciScintilla::SCI_MARKERSETBACKSELECTED,
//        QsciScintilla::SC_MARKNUM_FOLDEROPEN, QColor(0, 122, 204));
//    this->SendScintilla(QsciScintilla::SCI_MARKERSETBACKSELECTED,
//        QsciScintilla::SC_MARKNUM_FOLDER, QColor(0, 122, 204));
//    this->SendScintilla(QsciScintilla::SCI_MARKERSETBACKSELECTED,
//        QsciScintilla::SC_MARKNUM_FOLDERSUB, QColor(0, 122, 204));
//    this->SendScintilla(QsciScintilla::SCI_MARKERSETBACKSELECTED,
//        QsciScintilla::SC_MARKNUM_FOLDERTAIL, QColor(0, 122, 204));
//    this->SendScintilla(QsciScintilla::SCI_MARKERSETBACKSELECTED,
//        QsciScintilla::SC_MARKNUM_FOLDEREND, QColor(0, 122, 204));
//    this->SendScintilla(QsciScintilla::SCI_MARKERSETBACKSELECTED,
//        QsciScintilla::SC_MARKNUM_FOLDEROPENMID, QColor(0, 122, 204));
//    this->SendScintilla(QsciScintilla::SCI_MARKERSETBACKSELECTED,
//        QsciScintilla::SC_MARKNUM_FOLDERMIDTAIL, QColor(0, 122, 204));

//    this->SendScintilla(QsciScintilla::SCI_STYLESETBACK,
//        QsciScintilla::STYLE_DEFAULT, QColor(30, 30, 30));

//    // CARET
//    this->SendScintilla(QsciScintilla::SCI_SETCARETPERIOD, 500);
//    this->SendScintilla(QsciScintilla::SCI_SETCARETWIDTH, 2);
//    this->SendScintilla(QsciScintilla::SCI_SETCARETLINEVISIBLE, 1);
//    this->SendScintilla(QsciScintilla::SCI_SETCARETFORE, QColor(255, 255, 255));
//    this->SendScintilla(QsciScintilla::SCI_SETCARETLINEBACK, QColor(40, 40, 40));

//    // brace Highlight
//    this->SendScintilla(QsciScintilla::SCI_STYLESETBACK, QsciScintilla::STYLE_BRACELIGHT,
//        QColor(30, 30, 30));
//    this->SendScintilla(QsciScintilla::SCI_STYLESETFORE, QsciScintilla::STYLE_BRACELIGHT, QColor(0, 122, 204));

//    // set margin click notify
//    this->setMarginSensitivity(QsciScintilla::SC_MARGIN_BACK, true);
//    this->setMarginSensitivity(QsciScintilla::SC_MARGIN_NUMBER, true);

//    // set fold style
//    this->SendScintilla(QsciScintilla::SCI_FOLDDISPLAYTEXTSETSTYLE,
//        QsciScintilla::SC_FOLDDISPLAYTEXT_STANDARD);

//    // set fold text color
//    this->SendScintilla(QsciScintilla::SCI_STYLESETBACK, QsciScintilla::STYLE_FOLDDISPLAYTEXT, QColor(30, 30, 30));
//    this->SendScintilla(QsciScintilla::SCI_STYLESETFORE, QsciScintilla::STYLE_FOLDDISPLAYTEXT, QColor(212, 212, 212));

//    // visibl policy
//    this->SendScintilla(QsciScintilla::SCI_SETVISIBLEPOLICY, QsciScintilla::VISIBLE_STRICT |
//        QsciScintilla::VISIBLE_SLOP, QsciScintilla::VISIBLE_SLOP);

//    // 设置鼠标悬停500毫秒后发送悬停消息
//    this->SendScintilla(QsciScintilla::SCI_SETMOUSEDWELLTIME, 500);
//}

//void VScintilla::init_connect()
//{
//    connect(this, &VScintilla::marginClicked, this, &VScintilla::slot_margin_clicked);
//}


int VScintilla::cursorPos()
{
    return this->SendScintilla(QsciScintilla::SCI_GETCURRENTPOS);
}

int VScintilla::cursorOfLine()
{
    return this->SendScintilla(QsciScintilla::SCI_LINEFROMPOSITION, this->cursorPos());
}

int VScintilla::anchorPos()
{
    return this->SendScintilla(QsciScintilla::SCI_GETANCHOR);
}

int VScintilla::anchorOfLine()
{
    return this->SendScintilla(QsciScintilla::SCI_LINEFROMPOSITION, this->anchorPos());
}

int VScintilla::posOfLine(int pos)
{
    return this->SendScintilla(QsciScintilla::SCI_LINEFROMPOSITION, pos);
}

int VScintilla::lineFoldLevel(int line)
{
    return this->SendScintilla(QsciScintilla::SCI_GETFOLDLEVEL, line) & QsciScintilla::SC_FOLDLEVELNUMBERMASK;
}

int VScintilla::lineStartPos(int line)
{
    return this->SendScintilla(QsciScintilla::SCI_POSITIONFROMLINE, line);
}

int VScintilla::lineEndPos(int line)
{
    return this->SendScintilla(QsciScintilla::SCI_GETLINEENDPOSITION, line);
}

int VScintilla::positionFormPoint(int x, int y)
{
    return this->SendScintilla(QsciScintilla::SCI_POSITIONFROMPOINT, x, y);
}

int VScintilla::posToLineQStringPos(int pos)
{
    int line = posOfLine(pos);
    int line_start = lineStartPos(line);
    if (line_start == pos)
    {
        return 0;
    }

    QString line_text = this->text(line);
    int temp_pos = line_start;
    for (int i = 0; i < line_text.length(); i++)
    {
        QString str = line_text.at(i);
        temp_pos += str.toStdString().length();
        if (temp_pos == pos)
        {
            return i + 1;
        }
    }

    return -1;
}

void VScintilla::setSelect(int start, int end)
{
    this->SendScintilla(QsciScintilla::SCI_SETSEL, start, end);
}

void VScintilla::setSelectStartPos(int pos)
{
    this->SendScintilla(QsciScintilla::SCI_SETSELECTIONSTART, pos);
}

void VScintilla::setSelectEndPos(int pos)
{
    this->SendScintilla(QsciScintilla::SCI_SETSELECTIONEND, pos);
}

void VScintilla::setCursorPos(int pos)
{
    this->SendScintilla(QsciScintilla::SCI_SETCURRENTPOS, pos);
}

void VScintilla::setAnchorPos(int pos)
{
    this->SendScintilla(QsciScintilla::SCI_SETANCHOR, pos);
}

void VScintilla::setLineFold(int line)
{
    this->setLineFold(line);
//    this->SendScintilla(QsciScintilla::SCI_TOGGLEFOLDSHOWTEXT, line, (char*)"...}");
}

void VScintilla::insertText(int pos, const char * text)
{
    this->SendScintilla(QsciScintilla::SCI_INSERTTEXT, pos, (int)text);
}

void VScintilla::deleteRange(int pos, int length)
{
    this->SendScintilla(QsciScintilla::SCI_DELETERANGE, pos, length);
}

void VScintilla::backTab()
{
    this->SendScintilla(QsciScintilla::SCI_BACKTAB);
}

void VScintilla::Tab()
{
    this->SendScintilla(QsciScintilla::SCI_TAB);
}

void VScintilla::clear()
{
    this->SendScintilla(QsciScintilla::SCI_CLEAR);
}

void VScintilla::addText(QString text)
{
    this->SendScintilla(QsciScintilla::SCI_ADDTEXT, text.toStdString().length(), text.toStdString().c_str());
}

bool VScintilla::getFoldExpanded(int line)
{
    auto result = this->SendScintilla(QsciScintilla::SCI_GETFOLDEXPANDED, line);
    if (result == 0)
    {
        return false;
    }
    return true;

}

//void VScintilla::slot_margin_clicked(int margin, int line)
//{
//    if (margin == QsciScintilla::SC_MARGIN_FORE)
//    {
//        this->SendScintilla(QsciScintilla::SCI_TOGGLEFOLDSHOWTEXT, line, (char*)"...}                                                                                                                                                                                                                                      ");
//    }
//}
